package com.ly.proxy615.dynamicsProxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class IdbProxy implements InvocationHandler {
    //声明对象类型
    private Object target;
    //构造器  将传入对象赋给声明的对象
    public IdbProxy(Object target) {
        this.target=target;
    }

    public static void main(String[] args) {
        /*Idb o = (Idb) Proxy.newProxyInstance(IdbImpl.class.getClassLoader(), new Class[]{Idb.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("日志:" + Arrays.toString(args));
                method.invoke(new IdbImpl(), args);
                System.out.println("结束");
                return null;
            }

        });

        o.request("127.0.0.1");*/
        //构造器

        //生成动态代理对象
        IdbProxy idbProxy = new IdbProxy(new IdbImpl());
        //动态代理对象执行方法 传入接口类加载器,类..及动态代理对象  生成代理对象
        Idb o = (Idb) Proxy.newProxyInstance(Idb.class.getClassLoader(), new Class[]{Idb.class}, idbProxy);
        //运行
        o.request("127.0.0.4");
    }


    /**
     * 实现invocationHandler接口
     * 重写invoke方法
     * 方法内重写before与after方法
     * 并生成代理对象==>method.invoke(实现类,参数);返回一个Object
     *  返回Object
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("kaishi参数为"+ Arrays.toString(args));
        Object result = method.invoke(target, args);
        System.out.println("结束");
        return result;
    }
}


/**
 *
 * jdk动态代理
 * 1编写接口
 * 2编写实现类,重写方法.
 * 3.1  main方法Proxy类调用newProxyInstance方法,参数12均为接口类型,参数3为new InvocationHandler对象重写方法
 *      在重写方法中编写前置后置方法
 *      中间method调用invoke方法,参数为新建实现类对象及方法参数
 *      返回null
 *      newProxyInstance方法返回代理对象.
 *      代理对象调用实现类的方法,运行即可
 * 3.2
 *      main类中实现InvocationHandler,
 *      声明一个Object
 *      定义一个有残构造,参数为实现类对象,
 *      重写invoke方法,在方法中编写前置后置方法
 *      method对象调用invoke方法,参数为Object及方法参数\
 *      invoke方法返回代理对象
 *      main方法中 new 代理类参数为实现类,返回代理对象
 *      Proxy调用newProxyInstance方法参数12均为接口类型,参数3为代理对象,返回被代理对象
 *      被代理对象调用方法,运行即可
 *
 */

